// 用户身份验证中间件
import jwt from 'jsonwebtoken';
import { redisClient } from '../db/index.js';
import User from '../server/User/UserModel.js';

// JWT密钥
const JWT_SECRET = process.env.JWT_SECRET || 'your_jwt_secret_key';

/**
 * 用户身份验证中间件
 * 验证JWT令牌并将用户信息添加到请求对象
 */
export const userAuthMiddleware = async (req, res, next) => {
  try {
    // 从请求头获取令牌
    const authHeader = req.headers.authorization;
    if (!authHeader) {
      return res.status(401).json({
        success: false,
        message: '未提供授权令牌'
      });
    }

    // 验证令牌格式
    const parts = authHeader.split(' ');
    if (parts.length !== 2 || parts[0] !== 'Bearer') {
      return res.status(401).json({
        success: false,
        message: '授权格式错误，请使用 Bearer token 格式'
      });
    }

    const token = parts[1];

    // 验证令牌
    const decoded = jwt.verify(token, JWT_SECRET);

    // 从Redis检查令牌是否有效（用于注销功能）
    const storedToken = await redisClient.get(`user:${decoded.id}`);
    if (!storedToken || storedToken !== token) {
      return res.status(401).json({
        success: false,
        message: '令牌已失效，请重新登录'
      });
    }

    // 检查用户账号是否存在且状态正常
    const user = await User.findByPk(decoded.id);
    if (!user || user.status !== 'active') {
      return res.status(403).json({
        success: false,
        message: '用户账号不存在或已被禁用'
      });
    }

    // 将用户信息添加到请求对象
    req.user = {
      id: user.id,
      username: user.username
    };
    
    next();
  } catch (error) {
    if (error.name === 'TokenExpiredError') {
      return res.status(401).json({
        success: false,
        message: '令牌已过期，请重新登录'
      });
    }

    if (error.name === 'JsonWebTokenError') {
      return res.status(401).json({
        success: false,
        message: '无效的令牌'
      });
    }
    
    console.error('用户身份验证错误:', error);
    return res.status(500).json({
      success: false,
      message: '服务器内部错误'
    });
  }
}; 